package com.kuang.array;

/*给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出 和为目标值 target  的那 两个 整数，并返回它们的数组下标。

        你可以假设每种输入只会对应一个答案，并且你不能使用两次相同的元素。

        你可以按任意顺序返回答案。*/

import java.util.HashMap;

/**
 * @author kjx
 */
public class SumOfTwoNumbers {

    /*用 HaspMap 进行一个存储*/
    public static int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> map = new HashMap<>();
        //将数组的索引和数值反转存储
        for (int i = 0; i < nums.length; i++) {
            map.put(nums[i], i);
        }
        //遍历数组
        for (int i = 0; i < nums.length; i++) {
            int num = nums[i];
            int otherNum = target - num;
            //如果找不到需要的差值或者和数完全相同就跳过
            if (map.get(otherNum) == null && map.get(otherNum) == i) {
                continue;
            }
            return new int[]{i, map.get(otherNum)};
        }
        return null;
    }

    //对上面的进行补充，还可以更快，没有必要提前用一个O(n)的复杂度来存储所有的数组，可以边遍历边存储
    public static int[] twoSum2(int[] nums, int target) {
        HashMap<Integer, Integer> map = new HashMap<>(nums.length, 1);
        //遍历数组
        for (int i = 0; i < nums.length; i++) {
            int num = nums[i];
            int otherNum = target - num;
            if (map.get(otherNum) == null) {
                map.put(num, i);
            } else {
                return new int[]{i, map.get(otherNum)};
            }
        }
        return null;
    }

    public static void main(String[] args) {
        int[] test = {3, 2, 4};
        System.out.println(twoSum(test, 6));
    }
}
